#Boa:Frame:Frame1

import wx
import utiles
import consultasBD
import Vista
from decimal import Decimal

def create(parent):
    return Frame1(parent)

[wxID_FRAME1, wxID_FRAME1BUTTON1, wxID_FRAME1BUTTON2, wxID_FRAME1CHECKBOX1, 
 wxID_FRAME1CHECKBOX2, wxID_FRAME1COMBOBOX1, wxID_FRAME1COMBOBOX2, 
 wxID_FRAME1COMBOBOX3, wxID_FRAME1DATEPICKERCTRL1, wxID_FRAME1PANEL1, 
 wxID_FRAME1STATICTEXT1, wxID_FRAME1STATICTEXT2, wxID_FRAME1STATICTEXT3, 
 wxID_FRAME1STATICTEXT4, 
] = [wx.NewId() for _init_ctrls in range(14)]

class Frame1(wx.Frame):
    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Frame.__init__(self, id=wxID_FRAME1, name='', parent=prnt,
              pos=wx.Point(567, 231), size=wx.Size(306, 209),
              style=wx.DEFAULT_FRAME_STYLE, title='Listado Deudas')
        self.SetClientSize(wx.Size(298, 182))

        self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1, name='panel1', parent=self,
              pos=wx.Point(0, 0), size=wx.Size(298, 182),
              style=wx.TAB_TRAVERSAL)

        self.staticText1 = wx.StaticText(id=wxID_FRAME1STATICTEXT1,
              label='Fecha del informe', name='staticText1', parent=self.panel1,
              pos=wx.Point(16, 16), size=wx.Size(85, 13), style=0)

        self.datePickerCtrl1 = wx.DatePickerCtrl(id=wxID_FRAME1DATEPICKERCTRL1,
              name='datePickerCtrl1', parent=self.panel1, pos=wx.Point(112, 16),
              size=wx.Size(80, 21), style=wx.DP_DROPDOWN | wx.DP_SHOWCENTURY)
        self.datePickerCtrl1.Bind(wx.EVT_DATE_CHANGED, self.OnCambiarFecha,
              id=wxID_FRAME1DATEPICKERCTRL1)

        self.staticText2 = wx.StaticText(id=wxID_FRAME1STATICTEXT2,
              label='Sucursal', name='staticText2', parent=self.panel1,
              pos=wx.Point(16, 40), size=wx.Size(40, 13), style=0)

        self.comboBox1 = wx.ComboBox(choices=[], id=wxID_FRAME1COMBOBOX1,
              name='comboBox1', parent=self.panel1, pos=wx.Point(16, 56),
              size=wx.Size(176, 21), style=0, value='')
        self.comboBox1.SetLabel('')

        self.staticText3 = wx.StaticText(id=wxID_FRAME1STATICTEXT3,
              label='Separador decimal', name='staticText3', parent=self.panel1,
              pos=wx.Point(16, 112), size=wx.Size(88, 13), style=0)
        self.staticText3.Show(False)

        self.comboBox2 = wx.ComboBox(choices=[",", "."],
              id=wxID_FRAME1COMBOBOX2, name='comboBox2', parent=self.panel1,
              pos=wx.Point(112, 112), size=wx.Size(30, 21), style=0, value=',')
        self.comboBox2.SetLabel(',')
        self.comboBox2.Show(False)

        self.button1 = wx.Button(id=wxID_FRAME1BUTTON1, label='Aceptar',
              name='button1', parent=self.panel1, pos=wx.Point(16, 152),
              size=wx.Size(80, 24), style=0)
        self.button1.Bind(wx.EVT_BUTTON, self.OnBotonAceptar,
              id=wxID_FRAME1BUTTON1)

        self.button2 = wx.Button(id=wxID_FRAME1BUTTON2, label='Salir',
              name='button2', parent=self.panel1, pos=wx.Point(200, 152),
              size=wx.Size(80, 24), style=0)
        self.button2.Bind(wx.EVT_BUTTON, self.OnBotonCancelar,
              id=wxID_FRAME1BUTTON2)

        self.staticText4 = wx.StaticText(id=wxID_FRAME1STATICTEXT4,
              label='Tama\xf1o letra', name='staticText4', parent=self.panel1,
              pos=wx.Point(168, 112), size=wx.Size(65, 13), style=0)

        self.comboBox3 = wx.ComboBox(choices=['1', '2', '3', '4', '5'],
              id=wxID_FRAME1COMBOBOX3, name='comboBox3', parent=self.panel1,
              pos=wx.Point(240, 112), size=wx.Size(40, 21), style=0, value='2')
        self.comboBox3.SetLabel('2')

        self.checkBox1 = wx.CheckBox(id=wxID_FRAME1CHECKBOX1,
              label='Exportar a planilla', name='checkBox1', parent=self.panel1,
              pos=wx.Point(16, 88), size=wx.Size(112, 13), style=0)
        self.checkBox1.SetValue(False)
        self.checkBox1.Show(True)
        self.checkBox1.Bind(wx.EVT_CHECKBOX, self.OnExportarPlanilla,
              id=wxID_FRAME1CHECKBOX1)

        self.checkBox2 = wx.CheckBox(id=wxID_FRAME1CHECKBOX2,
              label='Incluye SALDO ACTUAL', name='checkBox2',
              parent=self.panel1, pos=wx.Point(152, 88), size=wx.Size(136, 13),
              style=0)
        self.checkBox2.SetValue(False)

    def __init__(self, parent):
        utiles.crearDirectorio()
        self._init_ctrls(parent)
        self.cargarSucursal()
        self.calculoDeFechas()
        self.conecta = True

    def calculoDeFechas(self):
        self.fecha1 = str(utiles.invertirFecha(self.datePickerCtrl1.GetLabel()))
        self.fecha2 = str(utiles.sumarDiasAFecha(utiles.strToDate(self.fecha1),-30))
        self.fecha3 = str(utiles.sumarDiasAFecha(utiles.strToDate(self.fecha1),-31))
        self.fecha4 = str(utiles.sumarDiasAFecha(utiles.strToDate(self.fecha1),-60))
        self.fecha5 = str(utiles.sumarDiasAFecha(utiles.strToDate(self.fecha1),-61))
        self.fecha6 = str(utiles.sumarDiasAFecha(utiles.strToDate(self.fecha1),-90))
        self.a30 = " vtas_ctasctes.vencimiento BETWEEN '"+self.fecha2+"'"+" AND "+"'"+self.fecha1+"' "
        self.a60 = " vtas_ctasctes.vencimiento BETWEEN '"+self.fecha4+"'"+" AND "+"'"+self.fecha3+"' "
        self.a90 = " vtas_ctasctes.vencimiento BETWEEN '"+self.fecha6+"'"+" AND "+"'"+self.fecha5+"' "
        self.m90 = " vtas_ctasctes.vencimiento < '"+self.fecha6+"' "
        self.actual = " vtas_ctasctes.vencimiento > '"+self.fecha1+"' "
        print "A 30 dias: "+self.fecha2+" / "+self.fecha1
        print "A 60 dias: "+self.fecha4+" / "+self.fecha3
        print "A 90 dias: "+self.fecha6+" / "+self.fecha5
        print "Mas de 90: "+self.fecha6
        print "Periodo actual: "+self.fecha1
        print

    def cargarSucursal(self):
        sucursal = utiles.getSucursalActiva()
        SQL = "SELECT nombre FROM sucursales WHERE codsucursal='%s'" % (sucursal)
        resultado = consultasBD.ordenCrudaDict(SQL)
        self.comboBox1.SetLabel(resultado[0]['nombre'])
        SQL = "SELECT nombre FROM sucursales"
        resultado = consultasBD.ordenCrudaDict(SQL)
        for i,item in enumerate(resultado):
            self.comboBox1.Append(item["nombre"])

    def OnBotonCancelar(self, event):
        self.Close()

    def OnCambiarFecha(self, event):
        self.calculoDeFechas()

    def OnBotonAceptar(self, event):
        self.button1.Enable(False)
        self.comboBox1.Enable(False)
        self.comboBox2.Enable(False)
        self.datePickerCtrl1.Enable(False)
        self.button2.SetLabel("Procesando")
        #creamos tabla provisoria para guardar resultados
        sql = "DROP TABLE IF EXISTS listadodeudas"
        consultasBD.ordenCruda(sql)
        sql = "DROP TABLE IF EXISTS listadodeudas2"
        consultasBD.ordenCruda(sql)
        print "Creando tablas auxiliares"
        r1 = "CREATE TABLE listadodeudas (`id` INT(5) NOT NULL AUTO_INCREMENT,"
        r2 = "`sucursal` INT(3) NOT NULL, "
        r3 = "`idcliente` VARCHAR(20) NOT NULL,`nombre` VARCHAR(50) NOT NULL,`telefono` VARCHAR(40) NOT NULL,"
        r4 = "`deuda30` VARCHAR(20) NOT NULL DEFAULT  '0',"
        r5 = "`deuda60` VARCHAR(20) NOT NULL DEFAULT  '0',"
        r6 = "`deuda90` VARCHAR(20) NOT NULL DEFAULT  '0',"
        r7 = "`deudama` VARCHAR(20) NOT NULL DEFAULT  '0',"
        r8 = "`actual` VARCHAR(20) NOT NULL DEFAULT  '0',"
        r9 = "PRIMARY KEY (`id`)) ENGINE = INNODB"
        sql = r1 + r2 + r3 + r4 + r5 + r6 + r7 + r8 + r9
        consultasBD.ordenCruda(sql)
        r1 = "CREATE TABLE listadodeudas2 (`id` INT(5) NOT NULL AUTO_INCREMENT,"
        r2 = "`sucursal` INT(3) NOT NULL, "
        r3 = "`idcliente` VARCHAR(20) NOT NULL,`nombre` VARCHAR(50) NOT NULL,`telefono` VARCHAR(40) NOT NULL DEFAULT '',"
        r4 = "`deuda30` VARCHAR(20) NOT NULL DEFAULT  '0',"
        r5 = "`deuda60` VARCHAR(20) NOT NULL DEFAULT  '0',"
        r6 = "`deuda90` VARCHAR(20) NOT NULL DEFAULT  '0',"
        r7 = "`deudama` VARCHAR(20) NOT NULL DEFAULT  '0',"
        r8 = "`actual` VARCHAR(20) NOT NULL DEFAULT  '0',"
        r9 = "PRIMARY KEY (`id`)) ENGINE = INNODB"
        sql = r1 + r2 + r3 + r4 + r5 + r6 + r7 + r8 + r9
        consultasBD.ordenCruda(sql)

        self.generarListado()

        self.button1.Enable(True)
        self.comboBox1.Enable(True)
        self.comboBox2.Enable(True)
        self.datePickerCtrl1.Enable(True)
        self.button2.SetLabel("Salir")
        self.button2.SetFocus()
        # eliminamos tablas provisorias
        print "Eliminando tablas auxiliares"
        sql = "DROP TABLE listadodeudas"
        consultasBD.ordenCruda(sql)
        sql = "DROP TABLE listadodeudas2"
        consultasBD.ordenCruda(sql)

    def existeRegistro(self,idcliente,indice):
        consultaSQL = "SELECT idcliente FROM listadodeudas WHERE idcliente='"+idcliente+"' AND sucursal='"+str(indice)+"'"
        self.resultado = consultasBD.ordenCruda(consultaSQL)
        if self.resultado == ():
            return False
        return True

    def consultasSQL(self,periodo,indice,campo):
        r1 = "SELECT paso3.idcliente, nombre, telefono, deuda "
        r2 = "FROM (SELECT paso2.idcliente, SUM(montocuota-montopagado) AS deuda "
        r3 = "      FROM (SELECT paso1.idcliente "
        r4 = "            FROM (SELECT idcliente,sum(montocuota) AS cuota,sum(montopagado) AS pagado "
        r5 = "                  FROM vtas_ctasctes "
        r6 = "                  WHERE 1 GROUP BY vtas_ctasctes.idcliente) as paso1 "
        r7 = "            WHERE cuota-pagado<>0) as paso2, vtas_ctasctes "
        r8 = "      WHERE paso2.idcliente = vtas_ctasctes.idcliente AND (montocuota-montopagado)<>0 AND "+periodo
        #r8 = "      WHERE paso2.idcliente = vtas_ctasctes.idcliente AND "+periodo
        r9 = "      GROUP BY paso2.idcliente) AS paso3, cliente "
        r0 = "WHERE paso3.idcliente=cliente.idcliente ORDER BY nombre ASC"
        consultaSQL = r1 + r2 + r3 + r4 + r5 + r6 + r7 + r8 + r9 + r0
        self.resultado,self.conecta = consultasBD.ordenCrudaRemota(consultaSQL,indice)
        if self.conecta:
            for item in self.resultado:
                r1 = "listadodeudas2(sucursal,idcliente,nombre,telefono,"+campo+")"
                r2 = "('"+str(indice+1)+"','"+item[0]+"','"+item[1]+"','"+str(item[2])+"','"+str(item[3])+"')"
                consultaSQL = r1 + r2
                consultasBD.executaInsertSQL(self,r1,r2)
        else:
            texto = "Sin conexion con la sucursal\n"+self.comboBox1.GetValue()
            utiles.mensaje(None,texto)
            self.resultado = ()
        return

    def condensando(self,indice):
        r1 = "SELECT sucursal,idcliente,nombre,telefono,deuda30,deuda60,deuda90,deudama,actual FROM listadodeudas2 "
        r2 = "WHERE sucursal = '"+str(indice+1)+"' "
        r3 = ""
        #se incluye o no quienes solo tienen deuda sin vencer?
        #tildado: True
        if not self.checkBox2.GetValue():
            r3 = "AND deuda30+deuda60+deuda90+deudama<>0 "
        r4 = "ORDER BY nombre ASC"
        consultaSQL = r1 + r2 + r3 + r4
        print consultaSQL
        self.resultado = consultasBD.ordenCrudaDict(consultaSQL)
        
        print "Consolidando la informacion"
        procesados = 0
        for item in self.resultado:
            if not self.existeRegistro(item['idcliente'],indice+1):
                r1 = "listadodeudas(sucursal,idcliente,nombre,telefono)"
                r2 = "('"+str(item['sucursal'])+"','"+str(item['idcliente'])+"','"+str(item['nombre'])+"','"+str(item['telefono'])+"')"
                consultaSQL = r1 + r2
                consultasBD.executaInsertSQL(None,r1,r2)
                print "Procesando",item['idcliente'],item['nombre']
                procesados += 1
            if item['deuda30']<>"0":
                tabla = "listadodeudas"
                campos = "deuda30='"+item['deuda30']+"'"
                condicion = "idcliente='"+item['idcliente']+"' AND sucursal='"+str(item['sucursal'])+"'"
                consultasBD.executaUpdateSQL(None,tabla,campos,condicion)
                continue
            if item['deuda60']<>"0":
                tabla = "listadodeudas"
                campos = "deuda60='"+item['deuda60']+"'"
                condicion = "idcliente='"+item['idcliente']+"' AND sucursal='"+str(item['sucursal'])+"'"
                consultasBD.executaUpdateSQL(None,tabla,campos,condicion)
                continue
            if item['deuda90']<>"0":
                tabla = "listadodeudas"
                campos = "deuda90='"+item['deuda90']+"'"
                condicion = "idcliente='"+item['idcliente']+"' AND sucursal='"+str(item['sucursal'])+"'"
                consultasBD.executaUpdateSQL(None,tabla,campos,condicion)
                continue
            if item['deudama']<>"0":
                tabla = "listadodeudas"
                campos = "deudama='"+item['deudama']+"'"
                condicion = "idcliente='"+item['idcliente']+"' AND sucursal='"+str(item['sucursal'])+"'"
                consultasBD.executaUpdateSQL(None,tabla,campos,condicion)
                continue
            if item['actual']<>"0":
                tabla = "listadodeudas"
                campos = "actual='"+item['actual']+"'"
                condicion = "idcliente='"+item['idcliente']+"' AND sucursal='"+str(item['sucursal'])+"'"
                consultasBD.executaUpdateSQL(None,tabla,campos,condicion)
                continue
        texto = "Registros procesados para sucursal "+self.comboBox1.GetValue()+": "
        print texto,procesados

    def OnExportarPlanilla(self, event):
        if self.checkBox1.GetValue():
            self.comboBox2.Show(True)
            self.staticText3.Show(True)
            self.staticText4.Show(False)
            self.comboBox3.Show(False)
        else:
            self.comboBox2.Show(False)
            self.staticText3.Show(False)
            self.staticText4.Show(True)
            self.comboBox3.Show(True)

    def imprimir(self,exportar=False):
        consultaSQL = "SELECT * FROM listadodeudas WHERE 1 ORDER BY nombre ASC"
        self.resultado = consultasBD.ordenCrudaDict(consultaSQL)
        
        matriz = []
        total = 0.00
        for item in self.resultado:
            if not self.checkBox2.GetValue():
                #no se incluyen clientes que solo tienen saldo actual
                valor = float(item['deuda30'])+float(item['deuda60'])+float(item['deuda90'])+float(item['deudama'])
                if valor == 0: continue
            renglon = []
            renglon.append(item['idcliente'])
            renglon.append(item['nombre'])
            renglon.append(item['telefono'])
            if item['deuda30'] != "0":
                renglon.append(Decimal(item['deuda30']).quantize(Decimal("0.10")))
            else:
                renglon.append("0.00")
            if item['deuda60'] != "0":
                renglon.append(Decimal(item['deuda60']).quantize(Decimal("0.10")))
            else:
                renglon.append("0.00")
            if item['deuda90'] != "0":
                renglon.append(Decimal(item['deuda90']).quantize(Decimal("0.10")))
            else:
                renglon.append("0.00")
            if item['deudama'] != "0":
                renglon.append(Decimal(item['deudama']).quantize(Decimal("0.10")))
            else:
                renglon.append("0.00")
            if item['actual'] != "0":
                renglon.append(Decimal(item['actual']).quantize(Decimal("0.10")))
            else:
                renglon.append("0.00")
            subtotal = float(item['deuda30'])
            subtotal+= float(item['deuda60'])
            subtotal+= float(item['deuda90'])
            subtotal+= float(item['deudama'])
            subtotal+= float(item['actual'])
            #quienes tengan saldo a su favor, son excluidos del informe
            if subtotal > 0:
                total += subtotal
                renglon.append(str(Decimal(str(subtotal)).quantize(Decimal("0.10"))))
                matriz.append(renglon)

        r1 = 'SELECT sum(deuda30),sum(deuda60),sum(deuda90),sum(deudama),sum(actual) FROM listadodeudas WHERE '
        r2 = '1'
##        #incluye saldo actual: tildado es True
##        if not self.checkBox2.GetValue():
##            r2 = 'deuda30<>0 AND deuda60<>0 AND deuda90<>0 AND deudama<>0'
        consultaSQL = r1 + r2
        self.resultado = consultasBD.ordenCruda(consultaSQL)
        renglon = []
        renglon.append("")
        renglon.append("TOTAL "+self.comboBox1.GetValue())
        renglon.append("")
        renglon.append(Decimal(str(self.resultado[0][0])))
        renglon.append(Decimal(str(self.resultado[0][1])))
        renglon.append(Decimal(str(self.resultado[0][2])))
        renglon.append(Decimal(str(self.resultado[0][3])))
        renglon.append(Decimal(str(self.resultado[0][4])))
        renglon.append(str(Decimal(str(total)).quantize(Decimal("0.10"))))
        matriz.append(renglon)

        titulo = "LISTADO DEUDORES DE LA SUCURSAL: "+self.comboBox1.GetValue()
        columnas = ["ID","Apellido, Nombre","Telefono","Deuda a\n30 dias","Deuda a\n60 dias","Deuda a\n90 dias","Deuda a mas\nde 90 dias","Deuda no\nvencida","Total"]
        alineacion = (0,0,0,2,2,2,2,2,2)
        f1 = utiles.invertirFecha2(self.fecha2)
        f2 = utiles.invertirFecha2(self.fecha1)
        f3 = utiles.invertirFecha2(self.fecha4)
        f4 = utiles.invertirFecha2(self.fecha3)
        f5 = utiles.invertirFecha2(self.fecha6)
        f6 = utiles.invertirFecha2(self.fecha5)
        periodos = [f1+" / "+f2,f3+" / "+f4,f5+" / "+f6]

        if not exportar:
            dlg = Vista.Vista(self, titulo)
            dlg.cargar_celdas(matriz, columnas, alineacion, periodos, self.comboBox3.GetValue())
            try:
                dlg.ShowModal()
            finally:
                dlg.Destroy()        
        else:
            print "Exportando datos a planilla"
            #abriendo archivo para recibir datos
            nameFile = "c:\\matrisamor.doc\\sussandeudores-"+utiles.getfechaInverseTime2()+".cvs"
            archivo = open(nameFile,"w")
            archivo.writelines(titulo+"\n")
            archivo.writelines("Periodos:;a 30 dias: "+periodos[0]+";a 60 dias: "+periodos[1]+";a 90 dias: "+periodos[2]+"\n")
            archivo.writelines("ID;Apellido, Nombre;Telefono;Deuda a 30 dias;Deuda a 60 dias;Deuda a 90 dias;Deuda a mas de 90 dias;Deuda no vencida;Total\n")
            for i in xrange(len(matriz)):
                d30 = str(matriz[i][3]).lstrip(" ").replace(".",self.comboBox2.GetLabel())
                d60 = str(matriz[i][4]).lstrip(" ").replace(".",self.comboBox2.GetLabel())
                d90 = str(matriz[i][5]).lstrip(" ").replace(".",self.comboBox2.GetLabel())
                dma = str(matriz[i][6]).lstrip(" ").replace(".",self.comboBox2.GetLabel())
                act = str(matriz[i][7]).lstrip(" ").replace(".",self.comboBox2.GetLabel())
                tot = str(matriz[i][8]).lstrip(" ").replace(".",self.comboBox2.GetLabel())
                archivo.writelines(matriz[i][0]+";"+matriz[i][1]+";"+matriz[i][2]+";"+d30+";"+d60+";"+d90+";"+dma+";"+act+";"+tot+"\n")
            archivo.close()
            utiles.mensaje(None,"Informe finalizado en C:\\matrisamor.doc\\\n"+nameFile)
     
    def generarListado(self):
        print
        print "SUCURSAL:",self.comboBox1.GetValue()
        for indice,sucursal in enumerate(self.comboBox1.GetItems()):
            if self.comboBox1.GetValue() == sucursal:
                break
            
        self.conecta = True
        print "-----------------------------------------------------------"
        if self.conecta: 
            print "Procesando a 30 dias >",
            self.consultasSQL(self.a30,indice,"deuda30")
        if self.conecta: 
            print "Procesando a 60 dias >",
            self.consultasSQL(self.a60,indice,"deuda60")
        if self.conecta: 
            print "Procesando a 90 dias >",
            self.consultasSQL(self.a90,indice,"deuda90")
        if self.conecta: 
            print "Procesando mas de 90 dias >",
            self.consultasSQL(self.m90,indice,"deudama")
        if self.conecta: 
            print "Procesando vencimientos futuros >",
            self.consultasSQL(self.actual,indice,"actual")

        if not self.conecta:
            self.OnBotonCancelar(None)
            return

        self.condensando(indice)
        if not self.checkBox1.GetValue():
            self.imprimir()
        else:
            self.imprimir(True)

        self.OnBotonCancelar(None)
        return
